package com.itheima.d6_reflect_genericity;

import java.lang.reflect.Method;
import java.util.ArrayList;

public class ReflectDemo {
    public static void main(String[] args) throws Exception {
        ArrayList<String> lists1 = new ArrayList<>();
        ArrayList<Integer> lists2 = new ArrayList<>();

        lists1.add("Hello");
//        lists1.add(100); //报错

        lists2.add(100);
//        lists2.add("Hello"); //报错

        //讨论：list1和list2两个对象的类型会是一样的么？
        Class<? extends ArrayList> cls1 = lists1.getClass();
        Class<? extends ArrayList> cls2 = lists2.getClass();

        System.out.println(cls1 == cls2); //true
        //不管ArrayList中泛型设置为什么类型，字节码对象都是同一个

        System.out.println("---------------------------");

        ArrayList<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
//        list.add(100);

        // 需求：反射实现泛型擦除后，加入其他类型的元素
        //获取字节码对象
        Class<? extends ArrayList> cls = list.getClass();
        //获取add方法
        Method addMethod = cls.getDeclaredMethod("add", Object.class);
        //调用add方法
        addMethod.invoke(list, 100);
        System.out.println("list = " + list);

//        for (String str : list) {
//            System.out.println("str = " + str); //报错：ClassCastException
//        }

        for (Object str : list) {
            System.out.println("str = " + str);
        }

    }
}
